/**
 * @Description: app状态管理
 * @Author 卞鹏飞 <228443632@qq.com>
 * @create 02/08/24 3:36 PM
 */
import { defineStore } from 'pinia'
import { type RegistrableApp } from 'qiankun'
import serviceApi from '@/api/modules/services/index'
import useUserStore from '@/store/use-user-store.ts'
import { getIP } from 'webrtc-ip'

// types
import type { TRouter } from '@root/types/router'
import type { IAppStateAppDOMInfo, IAppStateAppHeaderInfo } from '@root/types/app-store'
import { type QIANKUN_PLATFORM } from '@/utils/constants.ts'
import { to } from 'sf-utils2'
// import {ElMessage} from "element-plus";
// import {throwError} from "@shared/utils/error";

const id = 'appStore'

export type PlatformType = (typeof QIANKUN_PLATFORM)[keyof typeof QIANKUN_PLATFORM]

type TMicroAppProps<T> = {
  name?: string // 应用名称，乾坤内部维护的 没用
  appName?: string // 应用名称 自己维护 没用
  container?: HTMLElement | string // 挂载容器
  onGlobalStateChange?: (state: any, prev?: any) => void // 通讯方法
  setGlobalState?: (state: any) => void // 设置全局值
  assertRouteNextTo?: Function
  platform?: PlatformType // 平台 cf-disposal个贷处置端。cf-manage个贷资管端。base法诉平台
  microId?: string // 应用唯一id
  base?: string // 路径前缀
  shared?: {
    cache?: any
    bus?: any
    store?: any
    router?: any // 通讯router
  }
  _parent_base?: string // 主要是法诉平台的变量
  hubSharedStore?: any
  __AUTH_ROUTE_NEXT_TO__?: (props: {
    router: any
    tabKey: string
    routerBase: string
    autoUpdateUrl: boolean
  }) => boolean // 是否允许跳转
} & {
  registrableApp?: RegistrableApp<T>
} & Record<string, any>

type TAppState = {
  router: TRouter
  appHeaderInfo: IAppStateAppHeaderInfo
  appDOMInfo: IAppStateAppDOMInfo
  publicIp: string
  microAppProps: TMicroAppProps<any>
}

export default defineStore(id, {
  state: () => {
    return {
      /**
       * 路由
       */
      router: undefined,

      /**
       * 获取 公网的ip
       */
      publicIp: undefined,

      /**
       * app header 头部
       */
      appHeaderInfo: {
        version: '', // 软件版本
        mode: 'PC', // 渠道
        clientType: 'opr', // 应用类型 运营中心
        deviceBrand: '', // 设备品牌
        deviceModel: '', // 设备型号
        deviceId: '' // 设备唯一标识
      },

      /**
       * app DOM 属性
       */
      appDOMInfo: {
        width: undefined, // 内容区域宽度
        height: undefined, // 内容区域高度
        el: undefined,
        left: undefined, // 内容区距离左侧
        top: undefined // 内容区距离顶部
      },

      microAppProps: {
        name: undefined, // 应用名称，乾坤内部维护的 没用
        appName: undefined, // 应用名称 自己维护 没用
        container: undefined, // 挂载容器
        onGlobalStateChange: undefined, // 通讯方法
        setGlobalState: undefined, // 设置全局值

        assertRouteNextTo: undefined,

        /**
         * 平台 cf-disposal个贷处置端。cf-manage个贷资管端。base法诉平台
         * @type {PlatformType}
         */
        platform: '',
        microId: undefined, // 应用唯一id
        base: undefined, // 路径前缀
        shared: {
          cache: undefined,
          bus: undefined,
          store: undefined,
          router: undefined // 通讯router
        },

        /** 主要是法诉平台的变量 */
        _parent_base: '/',
        hubSharedStore: undefined,

        /**
         * 是否允许跳转
         * @type {Function}
         * { router: props.router, tabKey: attrs.tabKey, routerBase: base, autoUpdateUrl: true }
         * @deprecated 废弃
         */
        __AUTH_ROUTE_NEXT_TO__: () => true
      } // 主应用初始化传递给 子应用全部数据
    } as unknown as TAppState
  },

  getters: {
    /**
     * 水印内容文字
     */
    _watermarkText(state) {
      const userStore = useUserStore()
      return [userStore.userInfo?.empName, state.publicIp].filter(Boolean).join(' ') || `消金业务综合平台`
    }
  },

  actions: {
    /**
     * 获取公网的ip
     */
    async getPublicIp() {
      try {
        if (this.publicIp || this.getPublicIp.__loading) return
        this.getPublicIp.__loading = true
        const [res1, err1] = await to(getIP())
        if (err1) return
        this.publicIp = res1 || ''

        if (!this.publicIp) {
          const [res, err] = await to(serviceApi.getPublicIp())
          if (err) return
          // if (err || res?.code !== 200) {
          // const message = res?.message || '获取公网的ip失败'
          // ElMessage.error(message)
          // return throwError(`operate`, message)
          // }
          this.publicIp = res?.IP?.IP || ''
        }
      } finally {
        this.getPublicIp.__loading = false
      }
    }
  }
})
